
export { }

let add = function (num: number) {

}

let rtn = function (num: number): string {
  return ""
}

// void 类型,代表函数 没有任何返回值,不能有return 或者是return 后边没有任何数据
let fnvoid = function (): void {
  return
}
// never 类型 表示函数永远不可能结束,报错,或者是自循环
let end = function (): never {
  // throw new Error("出错了")
  while (true) {

  }
}
// 要求fn 必须有2个参数,并且必须返回number
let fn: (a: number, b: number) => number
let add1 = (fn: (a: number, b: number) => number) => {

}



// 可选参数,在参数后边?,可选参数必须是 最后一位
// function fnxuan (arg1: number , arg2: number,arg3:number){

// }
function fnxuan(arg1: number, arg2: number, arg3?: number) {

}

fnxuan(10, 20)
fnxuan(10, 20, 30)


// 接口规定函数
interface SearchFunc {
  (source: string, subString: string): boolean;
}

let mySearch: SearchFunc;
mySearch = function(source: string, subString: string) {
  let result = source.search(subString);
  return result > -1;
}


type User = { name: string, age: number }

let obj = function (u: User): User[] {

  return [
    { name: '张三', age: 10 }
  ]
}


//  必须使用function的类型.不可以使用let 函数
// 函数重载,在函数实现之前,对函数进行多次的声明
function fncom(arg1: number, arg2: number);
function fncom(arg1: string, arg2: string);
function fncom(arg1: number | string, arg2: number | string): number | string {
  if (typeof arg1 == 'number' && typeof arg2 == 'number') {
    return arg2 + arg1
  }
  if (typeof arg1 == 'string' && typeof arg2 == 'string') {
    return "name"
  }
  // 有可能出现 
  throw Error("参数类型必须相同")

}
